package io.guanghe.common.utils;

import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.util.ArrayList;
import java.util.List;

@Component
public class FileUtils {

    public static String filePath;

    @Value("${guanghe.file-path}")
    public void setFilePath(String path) {
        filePath = path;
    }

    //获取文件保存路径
    public static String getFilePath() {
        return filePath.endsWith("/") ? filePath.substring(0, filePath.length() - 1) : filePath;
    }

    //在文件目录创建文件
    public static File createFile(String fileName) {
        checkFolderExist(getFilePath());
        return new File( getFilePath() + File.separator + fileName);
    }

    //在文件目录按日期创建文件
    public static File createFileInDate(String fileName) {
        checkFolderExist(getFilePath() + File.separator + DateUtils.getDate());
        return new File(getFilePath() + File.separator + DateUtils.getDate() + File.separator + fileName);
    }

    /**
     * 删除文件
     */
    public static void delFile(String filePathAndName) {
        try {
            String filePath = filePathAndName;
            filePath = filePath.toString();
            File myDelFile = new File(filePath);
            myDelFile.delete();
        } catch (Exception e) {
            System.out.println("删除文件操作出错");
            e.printStackTrace();
        }

    }

    public static boolean isExist(String fileName) {
        if (StringUtils.isNotEmpty(fileName)) {
            File oldfile = new File(fileName);
            if (oldfile.exists()) {
                return true;
            }
        }
        return false;
    }

    public static void checkFolderExist(String fileName) {
        if (StringUtils.isNotEmpty(fileName)) {
            File folder = new File(fileName);
            if (!folder.exists()) {
                folder.mkdirs();
            }
        }
    }

    /**
     * 复制单个文件
     */
    public static void copyFile(String oldPath, String newPath) {
        try {
            File oldfile = new File(oldPath);
            if (oldfile.exists()) {
                File destFile = new File(newPath);
                copyFileNIO(oldfile, destFile);
            }
        } catch (Exception e) {
            System.out.println("复制单个文件操作出错");
            e.printStackTrace();
        }

    }

    /**
     * 移动文件到指定目录
     */
    public static void moveFile(String oldPath, String newPath) {
        copyFile(oldPath, newPath);
        delFile(oldPath);
    }

    /**
     * 递归删除目录下的所有文件及子目录下所有文件
     */
    public static boolean deleteDir(File dir) {
        boolean ret = true;
        if (dir.isDirectory()) {
            String[] children = dir.list();
            // 递归删除目录中的子目录
            if (children != null) {
                for (int i = 0; i < children.length; i++) {
                    boolean success = deleteDir(new File(dir, children[i]));
                    if (!success) {
                        return false;
                    }
                }
            }
        }
        // 目录此时为空，可以删除
        try {
            ret = dir.delete();
            if (!ret) {

                System.out.println("删除失败：" + dir.getName());
                System.gc();//系统进行资源强制回收
                ret = dir.delete();
            }
        } catch (Exception ex) {
            ret = false;
        } finally {

        }
        return ret;
    }

    /**
     * 复制整个文件夹到指定目录
     */
    public static void copy(String src, String des) {
        File file1 = new File(src);
        String desDir = src.substring(src.lastIndexOf("\\") + 1, src.length());
        File[] fs = file1.listFiles();
        File file2 = new File(des + desDir);
        if (!file2.exists()) {
            file2.mkdirs();
        }
        if (fs != null) {
            for (File f : fs) {
                copyFile(f.getPath(), des + desDir + "\\" + f.getName()); // 调用文件拷贝的方法
            }
        }
    }

    /**
     * 获取文件夹下所有文件路径
     */
    public static List<String> getFilePathList(String dirPath) {
        List<String> filePathlist = new ArrayList<String>();
        File dir = new File(dirPath);
        File[] files = dir.listFiles(); // 该文件目录下文件全部放入数组
        if (files != null) {
            for (int i = 0; i < files.length; i++) {
                if (files[i].isDirectory()) { // 判断是文件还是文件夹
                    getFilePathList(files[i].getAbsolutePath()); // 获取文件绝对路径
                } else {
                    String strFileName = files[i].getAbsolutePath();
                    filePathlist.add(strFileName);
                }
            }
        }
        return filePathlist;
    }

    /**
     * NIO方式复制文件
     */
    public static void copyFileNIO(File originFile, File destFile) {
        File destDir = destFile.getParentFile();
        if (!destDir.exists()) {
            destDir.mkdirs();
        }
        FileInputStream fi = null;
        FileOutputStream fo = null;
        FileChannel in = null;
        FileChannel out = null;
        try {
            fi = new FileInputStream(originFile);
            fo = new FileOutputStream(destFile);
            in = fi.getChannel();// 得到对应的文件通道
            out = fo.getChannel();// 得到对应的文件通道
            in.transferTo(0, in.size(), out);// 连接两个通道，并且从in通道读取，然后写入out通道
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                fi.close();
                in.close();
                fo.close();
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
